Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Шаблонизатор и рекурсия (Виталий Агапов)
Author Message
Виталий Агапов
Заглянувший



Joined: 19 Apr 2006
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Tue May 09, 2006 9:25 pm (написано за 18 минут 2 секунды)
   Post subject: Шаблонизатор и рекурсия
Reply with quote

Помогите разобраться с выводом маркированного списка с неизвестным заранее количеством вложений при использовании шаблонизатора:

При выводе 2 уровней можно сделать так:
Code (html): скопировать код в буфер обмена
{t_component src=Page_Content_Header name="header"} 
        {foreach from="$header" key="header_id" item="data"}
            <p> (december.com/html/4/element/p.html){$data.value}</p>
                <ul> (december.com/html/4/element/ul.html)
                {t_component src=Page_Content_Header name="header2" parent_id="$header_id"}
                        {foreach from="$header2" key="header_id2" item="data2"}
                                <li> (december.com/html/4/element/li.html){$data2.value}</li>

                        {/foreach}
                {/t_component}
                </ul>
        {/foreach}
{/t_component}
А при неизвестном заранее количестве вложений непонятно, как "замкнуть" компонент на себя.
Подготовка массива данных по порядку вывода в коде компонента не решает проблему. Остается непонятным как определить, когда открывать и закрывать теги списка.
Back to top
View user's profile Send private message
Павел Чернышёв
Заглянувший



Joined: 13 Jul 2005
Posts: 10
Карма: 0
   поощрить/наказать

Location: Челябинск

PostPosted: Wed May 10, 2006 1:23 am (спустя 3 часа 57 минут; написано за 1 минуту 56 секунд)
   Post subject:
Reply with quote

Может быть ошибаюсь, но наверно проще хранить списки в многомерном массиве и
выводить при помощи функции {section},{sectionelse}.
Руководство по функции здесь. (smarty.php.net/manual/ru/language.function.section.php)
Back to top
View user's profile Send private message
Виталий Агапов
Заглянувший



Joined: 19 Apr 2006
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Wed May 10, 2006 8:37 am (спустя 7 часов 13 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Спасибо за подсказку, посмотрю, отпишусь.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu May 11, 2006 10:38 am (спустя 1 день 2 часа 1 минуту; написано за 7 минут 31 секунду)
   Post subject:
Reply with quote

Павел Чернышёв
Вы, к сожалению ошибаетесь: хранить древовидную структуру в многомерном массие проще, но выводить с помощью Смарти - крайне сложно (как раз из-за необходимости рекурсии)
Виталий Агапов
для подобного я создавал специальную структуру (кое-что я опустил):
Code (php): скопировать код в буфер обмена
$tree = array (www.php.net/array)();
$tree[] = array (www.php.net/array)('id'=>1, 'parent_id'=>0, 'name'=>'первый корень', 'nesting'=>0);
Порядок расположения элементов в $tree - именно так, как оно будет при выводе:
Code (any language): скопировать код в буфер обмена
Данные выгружались из БД с помощью dbtree (forum.dklab.ru/viewtopic.php?t=13675&postdays=0&postorder=asc&highlight=) (переработанного под мой случай) - поэтому получить нужную структуру было просто (этот коод я тоже могу привести). Шаблон:
Code (html): скопировать код в буфер обмена
{* Каждый элемент массив имеет элементы
    id, - id в таблице,
    parent_id - папская запись,
    path - линк,
    name - тайтл,
    nesting - уровень вложенности
*}
{assign var="nesting" value="-1"}
{assign var="list_title" value="Карта сайта"}
{foreach from=$rubrics item=item name=rublist}
    {if $nesting lt $item.nesting}
        <ul (december.com/html/4/element/ul.html) title="{$list_title|escape}"> (december.com/html/4/element/.html)
    {elseif $nesting gt $item.nesting}
        {section name=closelist1 max=10 loop="`$nesting-$item.nesting`"}</ul>{/section}
    {elseif not $smarty.foreach.rublist.first}
        </li>
    {/if}
    <li> (december.com/html/4/element/li.html)<a (december.com/html/4/element/a.html) href="{$item.path}" title="{$item.name|escape}" target="_self"> (december.com/html/4/element/.html){$item.name|escape}</a>
    {assign var="nesting" value="`$item.nesting`"}
    {* закрываем все списки *}
    {if $smarty.foreach.rublist.last}
        {section name=closelist2 loop=`$nesting+1`}</li></ul>{/section}
    {* {else}
        {assign var="title" value="`$item.name`"}
    *}
    {/if}
{/foreach}
вроде должно работать :)
Back to top
View user's profile Send private message
Виталий Агапов
Заглянувший



Joined: 19 Apr 2006
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Thu May 11, 2006 8:56 pm (спустя 10 часов 17 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

Огромное спасибо, все получилось.

Эхех, пойду учить Smarty. :)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML